package com.cskaoyan.connectionpool;

import com.cskaoyan.util.JDBCUtils;

import java.sql.Connection;
import java.util.LinkedList;

/**
 * 创建日期: 2022/07/01 11:01
 *
 * @author ciggar
 *
 * 自动扩容，设置连接池的上限
 *
 */
public class MyConnectionPoolV2 {

    // 从头部存，从尾部取
    static LinkedList<Connection> pool;

    // 初始化大小
    static int INIT_SIZE = 10;

    // 最小连接数
    static int MIN_SIZE = 2;

    // 扩容的大小
    static int INCREMENT = 5;

    // 最大的连接大小
    static int MAX_SIZE = 20;

    // 线程池中当前的总的连接数量
    static int count = 0;


    // 初始化pool
    static {

        pool = new LinkedList<>();

        addCapcity(INIT_SIZE);


    }


    // 获取连接
    public static Connection getConnection(){

        // 假如连接池中的连接数量少于某个临界值，就让其自动扩容
        if (pool.size() < MIN_SIZE) {
            addCapcity(INCREMENT);
        }


        Connection connection = pool.removeLast();

        return connection;

    }

    // 返回连接
    public static void returnConnection(Connection connection){

        pool.addFirst(connection);
    }



    // 扩容的方法
    private static void addCapcity(int nums){

        if (nums < 1){
            return;
        }

        // 判断count
        if (count > MAX_SIZE) {
            System.out.println("连接创建已到设置的上限…增加连接失败！");
            return;
        }

        for (int i = 0; i < nums; i++) {
            Connection connection = JDBCUtils.getConnection();
            pool.addFirst(connection);
            count ++;
        }
    }


}
